﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Text.RegularExpressions;

using BreukTrainer_EE_.BreukModel;
using BreukTrainer_EE_.Controller;

namespace BreukTrainer_EE_.View
{
    public partial class NieuweOpdracht : Form
    {
        public NieuweOpdracht()
        {
            InitializeComponent();
        }

        #region Genereer Breuken
        private void rdbGenereren_CheckedChanged(object sender, EventArgs e)
        {
            btnMaakBreuken.Enabled = ((RadioButton)sender).Checked;
        }
        private void rdbGenererenEenvoudig_CheckedChanged(object sender, EventArgs e)
        {
            textBovengrens.Enabled = rdbGenererenEenvoudig.Checked;
            textOndergrens.Enabled = rdbGenererenEenvoudig.Checked;
            ValidateMaakBreukenEenvoudig(sender, e);
        }
        private void ValidateMaakBreukenEenvoudig(object sender, EventArgs e)
        {
            //TODO fix ValidateMaakBreukenEenvoudig: NullReferenceException 
            btnMaakBreukenEenvoudig.Enabled = rdbGenererenEenvoudig.Checked;
            //btnMaakBreukenEenvoudig.Enabled = (bool)textOndergrens.Tag &&
                                                //(bool)textBovengrens.Tag &&
                                                //rdbGenererenEenvoudig.Checked;
        }

        private void btnMaakBreuken_Click(object sender, EventArgs e)
        {
            int n = (int)numericUpDownAantalBreuken.Value;
            UpdateDataGridViewBreuken(n,0,20);
        }

        private void btnMaakBreukenEenvoudig_Click(object sender, EventArgs e)
        {
            int onder = int.Parse(textOndergrens.Text);
            int boven = int.Parse(textBovengrens.Text);
            int n = (int)numericUpDownAantalBreuken.Value;
            UpdateDataGridViewBreuken(n, onder, boven);
        }
        private void UpdateDataGridViewBreuken(int aantal, int ondergrens, int bovengrens)
        {
            int count = dataGridViewBreuken.Rows.Count;
            List<Breuk> breukenlijst = OpgaveController.GenereerBreuken(aantal, ondergrens, bovengrens);
            int i = 1;
            foreach (Breuk b in breukenlijst)
            {
                dataGridViewBreuken.Rows.Add(i,b.ToString());
                i++;
            }
            dataGridViewBreuken.Update();
            btnRegistreerOpgave.Enabled = true;
        }

        private void dataGridViewBreuken_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
        {
            int count = dataGridViewBreuken.Rows.Count - 1;
            dataGridViewBreuken.Rows[count - 1].Cells[0].Value = count;
            groupBoxBewerkingen.Enabled = true;
        }

        private void rdbRandomBewerking_CheckedChanged(object sender, EventArgs e)
        {
            textAantalOpgaves.Enabled = ((RadioButton)sender).Checked;
        }
        private void chkTijdsLimiet_CheckedChanged(object sender, EventArgs e)
        {
            textTijd.Enabled = ((CheckBox)sender).Checked;
        }

        #endregion

        private void btnRegistreerOpgave_Click(object sender, EventArgs e)
        {
            if (dataGridViewBreuken.Rows.Count < 3) {
                MessageBox.Show("Gelieve 2 breuken of meer in te geven", "Fout");
                return;
            }
            Opdracht o = new Opdracht();
            o.Datum = dateTimePicker.Value;
            o.MaxScore = (byte)numericMaxScore.Value;
            o.Moeilijkheidsgraad = (byte)numericMoeilijkheid.Value;
            o.Status = false;
            if (chkTijdsLimiet.Checked) {
                o.Tijdslimiet = int.Parse(textTijd.Text);
            }
            Accessor.createOpdracht(o);
            foreach(Leerling ll in getToegewezenLeerlingen()){
                Accessor.insertLeerlingOpdracht(ll, o);
            }
            int aOpgaves=int.Parse(textAantalOpgaves.Text);
            OpgaveController oc=new OpgaveController(aOpgaves,dataGridViewBreuken.Rows.Count-1);
            for(int i=0;i<dataGridViewBreuken.Rows.Count-1;i++) {
                oc.Add(Breuk.Parse(dataGridViewBreuken.Rows[i].Cells[1].Value.ToString()));
            }
            if (rdbBasisbewerking.Checked)
            {
                oc.BasicOpgaves();
            }
            else { 
                oc.RandomOpgaves(); 
            }
            oc.insertDetailOpgaves(o);
            this.Dispose(false);
            new ViewOpdrachten().Show();
        }
        private List<Leerling> getToegewezenLeerlingen() {
            if (radioBtnKlas.Checked) {
                return Accessor.getLeerlingenFromKlas(cboKlas.SelectedValue.ToString());            
            }
            List<Leerling> llntmp = new List<Leerling>();
            foreach (String s in clLeerlingen.CheckedItems) {
                llntmp.Add(Accessor.StringToLeerling(s));
            }
            return llntmp;
        }
        private void radioBtnKlas_CheckedChanged(object sender, EventArgs e)
        {
            cboKlas.Enabled = ((RadioButton)sender).Checked;
        }
        private void radioBtnLeerlingen_CheckedChanged(object sender, EventArgs e)
        {
            clLeerlingen.Enabled = ((RadioButton)sender).Checked;
        }
        private void vulLeerlingenLijst()
        {
            List<Leerling> lln = Accessor.GetLeerlingen();
            foreach (Leerling l in lln)
            {
                clLeerlingen.Items.Add(l.Naam.ToString());
            }
        }
        private void vulKlassenLijst()
        {
            cboKlas.DataSource = Accessor.GetDistinctKlassen();
        }

        private void NieuweOpdracht_Load(object sender, EventArgs e)
        {
            vulLeerlingenLijst();
            vulKlassenLijst();
        }

        private void dataGridViewBreuken_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
        {
            DataGridView dgvTemp = (DataGridView)sender;
            dgvTemp.Rows[e.RowIndex].ErrorText = "";
            if (dgvTemp.RowCount > 1 && dgvTemp.Columns[e.ColumnIndex].Name == "breuken" && e.FormattedValue.ToString()!="")
            {
                Regex reg = new Regex("^-?\\d+(/([1-9]|\\d{2,}))?$");
                if (!reg.IsMatch(e.FormattedValue.ToString()))
                {
                    dgvTemp.Rows[e.RowIndex].ErrorText = "Geen geldige breuk ingegeven";
                    e.Cancel = true;
                }
            }
        }

        private void dataGridViewBreuken_CellEndEdit(object sender, DataGridViewCellEventArgs e)
        {
            if (((DataGridView)sender).Rows[e.RowIndex].Cells[e.ColumnIndex].Value == null) {
                ((DataGridView)sender).Rows[e.RowIndex].Cells[e.ColumnIndex].Value = 0;
            }
            enableBtnRegistreerOpgave(sender);
        }

        private void dataGridViewBreuken_RowsRemoved(object sender, DataGridViewRowsRemovedEventArgs e)
        {
            enableBtnRegistreerOpgave(sender);
        }
        public void enableBtnRegistreerOpgave(object sender) {
            if (((DataGridView)sender).Rows.Count > 2)
            {
                btnRegistreerOpgave.Enabled = true;
            }
            else
            {
                btnRegistreerOpgave.Enabled = false;
            }
        }

        private void textTijd_Validating(object sender, CancelEventArgs e)
        {
            ValidateField(sender, e);
       }
        public void ValidateField(object sender, CancelEventArgs e) {
            try
            {
                Int32.Parse(((TextBox)sender).Text);
            }
            catch
            {
                e.Cancel = true;
                MessageBox.Show("Dit is geen geldig nummer", "Fout");
            }
        }

        private void NieuweOpdracht_FormClosed(object sender, FormClosedEventArgs e)
        {
            new ViewOpdrachten().Show();
        }

        private void textAantalOpgaves_Validating(object sender, CancelEventArgs e)
        {
            ValidateField(sender, e);
        }

        private void textBovengrens_Validating(object sender, CancelEventArgs e)
        {
            ValidateField(sender, e);
        }

        private void textOndergrens_Validating(object sender, CancelEventArgs e)
        {
            ValidateField(sender, e);
        }
    }
}
